# -*- coding: utf-8 -*-
 ##############################################
 ##                                            ##
 ##       Data model for Pedidos package        ##
 ##                                             ##
 ##                                             ##
 ##              from Basiq Series              ##
 ##           by Críptidos Digitales            ##
 ##                 GPL (c)2008                 ##
  ##                                            ##
    ##############################################

"""
"""
#~ from mainModel import *

from baseModel import *


import sys






def addresses(**filters):
    data = getAll('addressV', rol_id=filters['id'])
    return data


def getCondiciones():
    registros = getAttributes(grupo=u'condicionesPago')
    return registros


def folio():
    folio = int(getAttribute(grupo=u'folioDocumento', nombre=u'pedido')['valor'])
    folio += 1
    return unicode(folio).zfill(4)


def modificaFolio(folio):
    atributeModify(grupo=u'folioDocumento', nombre=u'pedido', valor=unicode(folio))
    # registro = atributoI(grupo=u'folioDocumento', nombre=u'pedido', valor=unicode(folio))


def lineasProducto():
    lineas = getAttributes(grupo=u'líneaProducto', order=u'referencia')
    return lineas


@property
def ordersCount():
    documentType = getAttribute(grupo=u'tipoDocumento', nombre=u'pedido')
    execute("""SELECT count(*) FROM documentos WHERE tipo_id=%s""")
    count = fetchone()
    return count


@property
def productsCount():
    query("""SELECT count(*) FROM products""")
    return fetchone()

def rutaDocumentos():
    ruta = getAttribute(grupo=u'sistema', nombre=u'rutaDocumentos')['valor']
    return ruta


def suppliers():
    supplierType = getAttribute(grupo='tipoRol', nombre='proveedor')
    query ("""SELECT roles.*, e.personalidad, e.nombre, e.nombre2, e.alias, e.fechanacimiento, e.rfc, e.curp FROM roles JOIN entidades AS e ON (roles.entidad_id=e.id) WHERE tipo_id=%s ORDER BY nombre""" % supplierType['id'])
    suppliers = fetchAll()

    global __suppliersCount
    __suppliersCount = len(suppliers)

    return suppliers


@property
def suppliersCount():
    return __suppliersCount










def acepcionExiste(**filtros):
    f=g
    try:
        registro = man.session().query(Acepcion).filter(Acepcion.producto_id==filtros['producto_id']).filter(Acepcion.rol_id==filtros['rol_id']).filter(Acepcion.status==u'actual').one()
        return True
    except:
        return False


def agrega(data):
    status = True

    ## Proceso (nuevo)
    proceso = Proceso(tipo=u'compra', status=u'abierto')
    man.session().add(proceso)
    man.session().flush()

    ## Operacion de solicitud
    operacion = Operacion(operacion_tipo=u'solicitud', cuenta=u'inventarios', fecha=data['fecha'], monto=data['total'], status=u'abierta')
    proceso.operaciones.append(operacion)
    man.session().add(operacion)
    man.session().flush()

    ## Documento
    tipoDocumento = attribute(grupo=u'tipoDocumento', nombre=u'pedido')
    documento = Documento(operacion_id=operacion.operacion_id, tipo_id=tipoDocumento['id'], folio=data['folio'], fecha=data['fecha'], rol_id=data['rol_id'], subtotal=data['subtotal'], descuento=data['descuento'], descuentoporcentaje=data['descuentoPorcentaje'], impuesto=data['impuesto'], impuestoporcentaje=data['impuestoPorcentaje'], total=data['total'], status=u'abierto')
    man.session().add(documento)
    man.session().flush()

    ## Partidas
    for item in data['partidas']:
        # acepcion = acepcionI(producto_id=item['producto_id'], rol_id=data['rol_id'])
        # acepcion.setData(codigo=item['codigo'], nombre=item['nombre'], costo=item['costo'], descuentogeneral=item['descuento'], fecha=data['fecha'], status=u'actual')
        # man.session().flush()

        partida = PartidaDocumento(documento_id=documento.documento_id, producto_id=item['producto_id'], cantidad=item['cantidad'], costo=item['costo'], precio=item['precio'], descuento=item['descuento'], impuesto=item['impuesto'], status=u'abierta')

        documento.partidas.append(partida)
        man.session().add(partida)
        man.session().flush()

    man.session().commit()

    if data['folio'] == folio():
        modificaFolio(data['folio'])

    return status


def acepcionIX(**datos):
    f=g
    #! No se ha implementado el caso de que se reciba una instancia como parámetro

    try:
        """ Primero se prueba con todos los parámetros
            por si se trata de una consulta, también funciona si se recibe sólo el id """
        acepcion = man.session().query(Acepcion).filter_by(**datos).one()
    except:
        """ Si no es consulta, es modificación o alta """
        try:
            """ Si se recibe el id y no se trata de una consulta (algún parámetro no
                coincide con el contenido en la base de datos),
                se trata de una modificación"""
            acepcionOld = man.session().query(Acepcion).filter(Acepcion.id==datos['id']).one()
            acepcionOld.setData(status=u'obsoleto')
            man.session().add(acepcionOld)
            datos['status'] = u'actual'
            acepcion = Acepcion(**datos)
        except:
            try:
                """Se insiste si se trata de modificación, búsqueda por unique constraint"""
                acepcionOld = man.session().query(Acepcion).filter(Acepcion.rol_id==datos['rol_id']).filter(Acepcion.producto_id==datos['producto_id']).filter(Acepcion.status==u'actual').one()
                acepcionOld.setData(status=u'obsoleto')
                man.session().add(acepcionOld)
                datos['status'] = u'actual'
                acepcion = Acepcion(**datos)
            except:
                """ Si no es modificación, es alta """
                datos['status'] = u'actual'
                acepcion = Acepcion(**datos)
        man.session().add(acepcion)
        man.session().commit()

    return acepcion


def dameAcepcion(**filtros):
    f=g
    if filtros.has_key('id'):
        registro = man.session().query(Acepcion).filter(Acepcion.id==filtros['id']).one()
    elif filtros.has_key('producto_id') and filtros.has_key('rol_id'):
        try:
            if filtros.has_key('status'):
                registro = man.session().query(Acepcion).filter(Acepcion.producto_id==filtros['producto_id']).filter(Acepcion.rol_id==filtros['rol_id']).filter(Acepcion.status==filtros['status']).one()
            else:
                registro = man.session().query(Acepcion).filter(Acepcion.producto_id==filtros['producto_id']).filter(Acepcion.rol_id==filtros['rol_id']).filter(Acepcion.status==u'actual').one()
        except:
            raise Exception("pedidos.manejador.dameAcepcion(%s)\n%s\n" % (filtros, sys.exc_info()[1]))
    elif 'codigo' in filtros.keys():
        # try:
            registro = man.session().query(Acepcion).filter(Acepcion.codigo==filtros['codigo']).filter(Acepcion.rol_id==filtros['rol_id']).filter(Acepcion.status==u'actual').one()
        # except:
            # raise Exception("pedidos.manejador.dameAcepcion(%s)\n%s\n" % (filtros, sys.exc_info()[1]))
    else:
        raise Exception("pedidos.manejador.dameAcepcion(%s)\nNo reconozco los parámetros\n" % filtros)
    return registro


# def dameFolio():
    # folio = int(atributoI(grupo=u'folioDocumento', nombre=u'pedido').valor)
    # folio += 1
    # return str(folio).zfill(4)




def damePartida(**filtros):
    registro = man.session().query(PartidaDocumento).filter(PartidaDocumento.documento_id==filtros['documento_id']).filter(PartidaDocumento.producto_id==filtros['producto_id']).first()
    return registro


def procesoI(**filtros):
    f=g
    m = "pedidos.manejador.procesoI()"
    if 'id' in filtros.keys():
        registro = man.session().query(Proceso).filter(Proceso.id==filtros['id']).one()
    elif 'documento_id' in filtros.keys():
        documento = documentoI(id=filtros['documento_id'])
        registro = man.session().query(Proceso).filter(Proceso.operaciones.any(id=documento.operacion_id)).one()
    else:
        registro = man.session().query(Proceso).filter(Proceso.operaciones.any(id=filtros['operacion_id'])).one()
    return registro


def producto(**filtros):
    registro = man.session().query(Producto).filter(Producto.id==filtros['id']).one()
    return registro


def damePropio():
    registro = rolI(tipo=u'propio')
    return registro


def dameRol(**filtros):
    f=g
    #! obsoleto use rol()
    registro = man.session().query(Rol).filter(Rol.id==filtros['id']).one()
    return registro


def dameUno(**filtros):
    registro = man.session().query(Documento).filter_by(id=filtros['id']).one()
    return registro


def elimina(**filtros):
    registro = man.session().query(Documento).filter(Documento.documento_id==filtros['id']).one()
    man.session().delete(registro)
    man.session().commit()


def modifica(data):
    f=g
    """ Crea o modifica los registros necesarios para
    """
    status = True

    documento = man.session().query(Documento).filter(Documento.documento_id==data['id']).one()

    documento.folio = data['folio']
    documento.fecha = data['fecha']
    documento.rol_id = data['rol_id']
    documento.subtotal = data['subtotal']
    documento.descuento = data['descuento']
    documento.descuentoporcentaje = data['descuentoPorcentaje']
    documento.impuesto = data['impuesto']
    documento.impuestoporcentaje = data['impuestoPorcentaje']
    documento.total = data['total']
    if 'status' in data.keys():
        documento.status = data['status']

    man.session().flush()

    for item in data['partidas']:

        acepcion = acepcionI(producto_id=item['producto_id'], rol_id=documento.rol_id)
        acepcion.setData(codigo=item['codigo'], nombre=item['nombre'], costo=item['costo'], descuentogeneral=item['descuento'], fecha=data['fecha'], status=u'actual')
        man.session().flush()

        partida = damePartida(documento_id=data['id'], producto_id=item['producto_id'])

        #~ acepcion = dameAcepcion(producto_id=item['producto_id'], rol_id=data['rol_id'])
        #~ partida = man.session().query(PartidaDocumento).filter(PartidaDocumento.acepcion_id==acepcion.id).filter(PartidaDocumento.documento_id==data['id']).first()
        #~ print partida

        if not partida:
            partida = PartidaDocumento(documento_id=data['id'], producto_id=item['producto_id'])
            documento.partidas.append(partida)

        partida.cantidad = item['cantidad']
        partida.costo = item['costo']
        partida.precio = item['precio']
        partida.descuento = item['descuento']
        partida.impuesto = item['impuesto']
        partida.status = item['status']

        man.session().add(partida)
        man.session().flush()

    man.session().commit()

    return status


# def modificaFolio(folio):
    # registro = atributoI(grupo=u'folioDocumento', nombre=u'pedido', valor=unicode(folio))


def operaciones_documentos(operacion_id, documento_id):
    operacion = operacionI(id=operacion_id)
    documento = dameDocumento(id=documento_id)
    operacion.documentos.append(documento)
    man.session().add(operacion)
    man.session().commit()



